package com.qijian.tool.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qijian.common.page.PageWith;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 分页工具类(特殊场景没法使用数据库分页情况下使用)
 */
public class ManualPageUtils {


    /**
     * 封装手动分页
     *
     * @param list     数据集合
     * @param pageNo   起始页
     * @param pageSize 每页尺寸
     */
    public static Page setPage(List list, Long pageNo, Long pageSize) {
        Page tPage = new Page<>();
        int totalCount = list.size();
        // 分页
        Long pageNum = totalCount / pageSize;
        Long surplus = totalCount % pageSize;
        if (surplus > 0) {
            pageNum = pageNum + 1;
        }
        List pageResult = getPageSizeDataForRelations(list, pageSize.intValue(), pageNo.intValue());
        tPage.setTotal(totalCount);
        tPage.setRecords(pageResult);

        return tPage;
    }

    /**
     * 封装手动分页
     *
     * @param list     数据集合
     * @param pageNo   起始页
     * @param pageSize 每页尺寸
     */
    public static PageWith setPageWith(List list, Long pageNo, Long pageSize ,Object o) {
        PageWith tPage = new PageWith();
        int totalCount = list.size();
        // 分页
        Long pageNum = totalCount / pageSize;
        Long surplus = totalCount % pageSize;
        if (surplus > 0) {
            pageNum = pageNum + 1;
        }
        List pageResult = getPageSizeDataForRelations(list, pageSize.intValue(), pageNo.intValue());
        tPage.setTotal(totalCount);
        tPage.setRecords(pageResult);
        tPage.setO(o);
        return tPage;
    }

    /**
     * 手动分页类
     *
     * @param datas
     * @param pageSize
     * @param pageNo
     * @param
     * @return
     */
    private static List getPageSizeDataForRelations(List datas, int pageSize, int pageNo) {
        int startNum = (pageNo - 1) * pageSize + 1;
        if (startNum > datas.size()) {
            return null;
        }
        List res = new ArrayList<>();
        int rum = datas.size() - startNum;
        if (rum < 0) {
            return null;
        }
        if (rum == 0) {
            int index = datas.size() - 1;
            res.add(datas.get(index));
            return res;
        }
        if (rum / pageSize >= 1) {
            for (int i = startNum; i < startNum + pageSize; i++) {
                res.add(datas.get(i - 1));
            }
            return res;
        } else if ((rum / pageSize == 0) && rum > 0) {
            for (int j = startNum; j <= datas.size(); j++) {
                res.add(datas.get(j - 1));
            }
            return res;
        } else {
            return null;
        }
    }

}
